package com.emmmya.ocs.modules.system.file.serviceimpl;

import com.emmmya.ocs.modules.system.file.service.DirectoryService;
import com.emmmya.ocs.common.base.BaseDao;
import com.emmmya.ocs.common.utils.ResultUtil;
import com.emmmya.ocs.common.vo.Result;
import com.emmmya.ocs.config.redis.SystemCacheRedisManager;
import com.emmmya.ocs.modules.system.file.dao.DirectoryDao;
import com.emmmya.ocs.modules.system.file.entity.Directory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.thymeleaf.util.StringUtils;

import java.util.List;

@Slf4j
@Service
@Transactional
public class DirectoryServiceImpl implements DirectoryService {
    @Autowired
    private DirectoryDao directoryDao;

    @Autowired
    private SystemCacheRedisManager sysCacheRedisManager;

    @Override
    public BaseDao<Directory, Long> getRepository() {
        return directoryDao;
    }

    /**
     * 创建文件夹
     * @param dir 实体
     * @return
     */
    @Override
    public Directory createDir(Directory dir) throws Exception{
        if(StringUtils.isEmpty(dir.getIsRoot())) {
            dir.setIsRoot("N");
        }
        //先查询其父文件夹id是否存在
        Directory parentDir = this.get(dir.getParentId());

        //获取其父文件夹下所有文件夹的名字，不能出现重复，如果重复抛出异常
        //获取父文件夹的全路径，用于拼接创建的文件夹的全路径前部分
        if(parentDir!=null){
            List<Directory> dirs = directoryDao.findByParentIdAndDirName(parentDir.getId(),dir.getDirName());
            //如果不存在，则查询出全路径并保存到实体中
            if(dirs.isEmpty()) {
                String path = parentDir.getPath();
                //如果是根目录的话，全路径的拼接方式
                if("Y".equals(parentDir.getIsRoot())){
                    dir.setPath(path  + dir.getDirName());
                }
                //非根目录的拼接方式
                else {
                    dir.setPath(path + "/" + dir.getDirName());
                }
            }
            //如果存在，则抛出异常
            else{
                //到时候这里要有自定义异常
                throw new RuntimeException("已存在同名文件夹");
            }
        }
        //如果不存在，则保存在实体中，再存入数据库
        Directory rDir = directoryDao.save(dir);
        return rDir;
    }

    @Override
    public Directory getRoot() {
        Directory byIsRoot = directoryDao.findByIsRoot("Y");
        return byIsRoot;
    }

    @Override
    public List<Directory> findByParentId(Long id) {
        return directoryDao.findByParentId(id);
    }

    @Override
    public boolean reName(Long dirId, String newName) {
        try {
            Directory dir = get(dirId);
            dir.setDirName(newName);
            Directory update = update(dir);
            return true;
        } catch (Exception e) {
            //e.printStackTrace();
            return false;
        }

    }

    @Override
    public Result<Object> clearCache(Long dirId) {
        try {
            Boolean del = sysCacheRedisManager.del("directory::" + dirId);
            if(del) {
                return ResultUtil.success("清除成功");
            }
            return ResultUtil.error("清除失败，请重试！");
        } catch (Exception e) {
            log.warn("【文件管理service】清除缓存时出现错误，错误信息："+e.getMessage());
            return ResultUtil.error(e);
        }
    }
}
